package main

import (
	"context"
	"os"
	"os/signal"
	"syscall"
	"time"

	"gitee.com/smewl13/beehive/internal/diskwatch"
	"gitee.com/smewl13/beehive/pkg/config"
	"gitee.com/smewl13/beehive/pkg/zaplog"
	"github.com/urfave/cli/v2"
	"go.uber.org/zap"
)

func NewAPP(ctx *cli.Context) *APP {
	file := ctx.String("config")
	conf := config.NewConfig(file)
	logger := zaplog.NewLogger(zaplog.NewLog(conf))

	return &APP{
		Monitor: diskwatch.NewMonitor(logger, conf),
		logger:  logger,
	}
}

type APP struct {
	*diskwatch.Monitor
	logger *zap.Logger
}

func (a *APP) Run() {
	// 创建一个取消的上下文，用于控制优雅退出
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	// 创建一个信号通道，用于接收操作系统的信号
	signalChan := make(chan os.Signal, 1)
	signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM) // 捕获 SIGINT 和 SIGTERM 信号

	// 启动一个 goroutine 进行信号监听
	go func() {
		sig := <-signalChan
		a.logger.Info("[磁盘守护]收到系统信号", zap.String("signal", sig.String()))
		// todo: 收到信号后取消上下文，进行清理
		cancel()
	}()

	// todo: 主程序逻辑
	a.Handle(ctx)

	for {
		select {
		case <-ctx.Done():
			// 收到关闭信号，执行清理
			a.cleanUp()
			a.logger.Info("[磁盘守护]监控功能停止...")
			return
		default:
			// 模拟应用程序工作
			time.Sleep(1 * time.Second)
		}
	}
}

// 清理资源的函数
func (a *APP) cleanUp() {
	// todo: 清理任务逻辑，如关闭数据库连接、清理缓存、保存日志等
}
